package avs.sistemaavs.controller;

import java.util.*;
import avs.sistemaavs.model.*;

public class ControladoraLocacao {
	Cliente c1 = null, c2 = null;
	ControladoraBusca b = new ControladoraBusca();
	//classe inchada
	//comentarios
	
	
	//comentarios
	//metodo longo
	//campo temporario
	public void realizarLocacao(Locadora locadora, ArrayList<Integer> numeroCatalogoFilmes, int numeroCartaoAVS){
		ControladoraDevolucao controladoraDevolucao = new ControladoraDevolucao();
		if(verificarPendenciasCliente(locadora, numeroCartaoAVS, controladoraDevolucao)){
			if(verificarVideos(locadora, numeroCatalogoFilmes)){
				/*
				 * Campo temporário valorDevido substituido por query
				 */
				Aluguel aluguel = new Aluguel(calcularDataDevolucao(), numeroCatalogoFilmes, numeroCartaoAVS, calcularTaxaLocacao(numeroCatalogoFilmes));
				/*
				 * Metodo atualizarValorDevido extraido
				 */
				//
				atualizarValorDevido(locadora, numeroCatalogoFilmes, numeroCartaoAVS);
				/*
				 * Metodo adicionarAluguelEmLocadora extraído
				 */
				//adicionar aluguel a lista de Alugueis da Locadora
				adicionarAluguelEmLocadora(locadora, aluguel);
			}
		}
	}

	private void adicionarAluguelEmLocadora(Locadora locadora, Aluguel aluguel) {
		locadora.getAluguel().add(aluguel);
	}

	private void atualizarValorDevido(Locadora locadora, ArrayList<Integer> numeroCatalogoFilmes, int numeroCartaoAVS) {
		c1 = b.BuscaCliente(locadora, c2, numeroCartaoAVS);
		c1.setValorDevido(calcularTaxaLocacao(numeroCatalogoFilmes));
	}
	
	/*
	 * Metodos clienteExiste e clienteSemPendencias extraídos
	 * queries clienteExiste e clienteSemPendencias substituidas
	 */
	//fazer dos metodos de condicionais privados
	private boolean verificarPendenciasCliente(Locadora locadora, int numeroCartaoAVS, ControladoraDevolucao controladoraDevolucao) {
		return clienteExiste(locadora, numeroCartaoAVS) && clienteSemPendencias(locadora,numeroCartaoAVS, controladoraDevolucao);
	}

	private boolean clienteSemPendencias(Locadora locadora, int numeroCartaoAVS, ControladoraDevolucao controladoraDevolucao) {
		return controladoraDevolucao.verificarPendenciaCliente(locadora, numeroCartaoAVS);
	}

	private boolean clienteExiste(Locadora locadora, int numeroCartaoAVS) {
		return verificarCliente(locadora, numeroCartaoAVS);
	}

	/*
	 * Metodo contarVideos extraido, variavel temporaria numeroVideos substituida por query
	 */
	public double calcularTaxaLocacao(ArrayList<Integer> numeroCatalogoFilmes){
		return contarVideos(numeroCatalogoFilmes) *2.0;
	}

	private int contarVideos(ArrayList<Integer> numeroCatalogoFilmes) {
		int numeroVideos = 0;
		Iterator<Integer> it = b.BuscaNumeroCatalogo(numeroCatalogoFilmes);
		while(it.hasNext()) {	 
			it.next(); 
			numeroVideos++;
		}
		return numeroVideos;
	}

	public Date calcularDataDevolucao(){
		Locale pt = new Locale("pt", "br");
		Calendar c = Calendar.getInstance(pt);
		c.add(Calendar.DATE, 3);
		Date dataDevolucao = c.getTime();
		return dataDevolucao;
	}

	/*
	 * Metodo atualizarQuantidadeVideos extraido
	 */
	public boolean verificarVideos(Locadora locadora, ArrayList<Integer> numeroCatalogoFilmes){
		//codigo duplicado
		Iterator<Integer> it = b.BuscaNumeroCatalogo(numeroCatalogoFilmes); 
		//verificar a disponibilidade de videos no estoque
		return atualizarQuantidadeVideos(locadora, it);

	}

	/*
	 * Metodo setarQuantidadeVideos extraida
	 */
	public boolean atualizarQuantidadeVideos(Locadora locadora, Iterator<Integer> it) {
		while(it.hasNext()){
			Integer numeroCatalogo = it.next();
			Video v1 = null, v2 = b.BuscaVideo(locadora, v1, numeroCatalogo);
			if(v2 != null){
				if(numeroCatalogo.equals(v2.getNumeroCatalogo())){
					if(v2.getQuantidade()>0){
						setarQuantidadeVideos(locadora, v2);
					}else{
						return false;
					}
				}
			}
		}
		return true;
	}
	
	private void setarQuantidadeVideos(Locadora locadora, Video v){
			v.setQuantidade(v.getQuantidade()-1);
	}
	
	public boolean verificarCliente(Locadora locadora,int numeroCartaoAVS){
		c1 = b.BuscaCliente(locadora, c2, numeroCartaoAVS);
		if (c1 == null)
			return false;
		else
			return true;

	}

}
